Skip to content

RENS - #1719

Open
nguidotti wants to merge 9 commits into
root-heuristicsfrom
rens
Open

RENS#1719
nguidotti wants to merge 9 commits into
root-heuristicsfrom
rens

Conversation

@nguidotti

@nguidotti nguidotti commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

This PR implements RENS (Relaxation Enforced Neighborhood Search, see [1, 2]) heuristic. RENS construct and then solve the following sub-MIP:

$$\begin{align} & z^* = \min \, \vec{c}^T \vec{x} \\ & \text{subject to} & \mathbf{A} \vec{x} = \vec{b} \\ & & l_i \leq x_i \leq u_i, \forall i \in \mathcal{N} \setminus \mathcal{I} \\ & & \lfloor \check{x}_j \rfloor \leq x_i \leq \lceil \check{x}_j \rceil, \forall i \in \mathcal{I} \\ & & \vec{x} \in \mathbb{R}^n \\ & & x_j \in \mathbb{Z}, \forall j \in \mathcal{I} \end{align}$$

where $\mathcal{N}$ is the set of all variables and $\mathcal{I}$ is the set of integer values. In essence, all integer variables with integral values are fixed, while the ones with fractional values are restricted to be rounded up or down.

This re-use the same infrastructure as RINS, i.e., it passes through presolve and can recurse. It requires some refactoring of the sub-MIP code to support these additional features.

Closes #1584.

Results

MIPLIB2017, GH200, 10min

================================================================================
 root-heuristics-1 (1) vs rens-1 (2)
================================================================================

------------------------------------------------------------------------------------------------------------------------------
|                                        |       Run 1        |       Run 2        |     Abs. Diff.     |   Rel. Diff. (%)   |
------------------------------------------------------------------------------------------------------------------------------
| Imported                                                 240                  240                   +0                 --- |
| Feasible                                                 225                  228                   +3                 --- |
| Optimal                                                   87                   89                   +2                 --- |
| Solutions with <0.1% primal gap                          143                  149                   +6                 --- |
| Nodes explored (mean)                              1.322e+07            1.301e+07           -2.131e+05               -1.61 |
| Nodes explored (shifted geomean)                        8201                 8070               -131.2                -1.6 |
| Relative MIP gap (mean)                               0.2695               0.2804             +0.01085               +4.02 |
| Relative MIP gap (shifted geomean)                    0.0867              0.08793            +0.001234               +1.42 |
| Solve time (mean)                                      415.6                416.1              +0.5025              +0.121 |
| Solve time (shifted geomean)                           179.6                191.3               +11.71               +6.52 |
| Primal gap (mean)                                      10.28                9.147                -1.13                 -11 |
| Primal gap (shifted geomean)                          0.4062               0.3354             -0.07082               -17.4 |
| Primal integral (mean)                                 22.11                20.83               -1.281                -5.8 |
| Primal integral (shifted geomean)                      2.074                2.086              +0.0123              +0.593 |
------------------------------------------------------------------------------------------------------------------------------


----------------------------------------------------------------------
|             Name             |     status 1     |     status 2     |
----------------------------------------------------------------------
| app1-2                                 feasible            optimal |
| cmflsp50-24-8-8                        feasible            optimal |
| csched007                              feasible            optimal |
| map16715-04                             optimal           feasible |
| neos-1171737                            optimal           feasible |
| neos-3216931-puriri                     timeout           feasible |
| neos-5104907-jarama                     timeout           feasible |
| peg-solitaire-a3                        timeout            optimal |
| rail01                                 feasible            timeout |
| rd-rplusc-21                            timeout           feasible |
----------------------------------------------------------------------

================================================================================
 root-heuristics-2 (1) vs rens-2 (2)
================================================================================

------------------------------------------------------------------------------------------------------------------------------
|                                        |       Run 1        |       Run 2        |     Abs. Diff.     |   Rel. Diff. (%)   |
------------------------------------------------------------------------------------------------------------------------------
| Imported                                                 240                  240                   +0                 --- |
| Feasible                                                 226                  228                   +2                 --- |
| Optimal                                                   87                   88                   +1                 --- |
| Solutions with <0.1% primal gap                          144                  140                   -4                 --- |
| Nodes explored (mean)                              1.343e+07            1.282e+07           -6.041e+05                -4.5 |
| Nodes explored (shifted geomean)                        8226                 7377               -849.4               -10.3 |
| Relative MIP gap (mean)                               0.2428               0.2958             +0.05298               +21.8 |
| Relative MIP gap (shifted geomean)                   0.08465              0.08925              +0.0046               +5.43 |
| Solve time (mean)                                        419                  417               -2.007              -0.479 |
| Solve time (shifted geomean)                           189.4                183.5               -5.886               -3.11 |
| Primal gap (mean)                                      9.654                9.246              -0.4081               -4.23 |
| Primal gap (shifted geomean)                          0.3891               0.3879            -0.001256              -0.323 |
| Primal integral (mean)                                 20.14                20.38              +0.2404               +1.19 |
| Primal integral (shifted geomean)                      2.073                2.125              +0.0524               +2.53 |
------------------------------------------------------------------------------------------------------------------------------


----------------------------------------------------------------------
|             Name             |     status 1     |     status 2     |
----------------------------------------------------------------------
| bnatt500                             infeasible            timeout |
| glass-sc                               feasible            optimal |
| mad                                    feasible            optimal |
| map16715-04                             optimal           feasible |
| neos-1171737                            optimal           feasible |
| neos-3754480-nidda                        error           feasible |
| neos-5093327-huahum                     optimal           feasible |
| peg-solitaire-a3                        timeout            optimal |
| triptim1                               feasible            optimal |
----------------------------------------------------------------------

References

[1] T. Berthold, “RENS: The optimal rounding,” Math. Prog. Comp., vol. 6, no. 1, pp. 33–54, Mar. 2014, doi: 10.1007/s12532-013-0060-9.
[2] T. Achterberg, “Constraint Integer Programming,” PhD, Technischen Universität Berlin, Berlin, 2007. doi: 10.14279/depositonce-1634.

Checklist

  • I am familiar with the Contributing Guidelines.
  • Testing
    • New or existing tests cover these changes
    • Added tests
    • Created an issue to follow-up
    • NA
  • Documentation
    • The documentation is up to date with these changes
    • Added new documentation
    • NA

@nguidotti nguidotti added this to the 26.10 milestone Aug 14, 2026
@nguidotti nguidotti self-assigned this Aug 14, 2026
@nguidotti nguidotti added non-breaking Introduces a non-breaking change improvement Improves an existing functionality mip labels Aug 14, 2026
@copy-pr-bot

copy-pr-bot Bot commented Aug 14, 2026

Copy link
Copy Markdown

Auto-sync is disabled for draft pull requests in this repository. Workflows must be run manually.

Contributors can view more details about this message here.

Comment thread cpp/src/branch_and_bound/branch_and_bound.cpp Outdated
@nguidotti

nguidotti commented Aug 14, 2026

Copy link
Copy Markdown
Contributor Author

/ok to test 7a9e5f4

@github-actions

github-actions Bot commented Aug 14, 2026

Copy link
Copy Markdown

CI Test Summary

✅ All 31 test job(s) passed.

@nguidotti
nguidotti marked this pull request as ready for review August 15, 2026 08:10
@nguidotti
nguidotti requested a review from a team as a code owner August 15, 2026 08:10
@nguidotti
nguidotti requested review from aliceb-nv, chris-maes, kaatish and rg20 and removed request for kaatish and rg20 August 15, 2026 08:10
Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
…ll variables to be picked.

Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

improvement Improves an existing functionality mip non-breaking Introduces a non-breaking change

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEA] RENS

2 participants